package org.jboss.resteasy.plugins.providers;


import java.util.Collection;

import javax.ws.rs.ext.ParamConverter;
import javax.ws.rs.ext.RuntimeDelegate.HeaderDelegate;

import org.jboss.resteasy.core.StringParameterInjector;

/**
 * @author Marek Kopecky mkopecky@redhat.com
 * @author Ron Sigal rsigal@redhat.com
 */
public abstract class MultiValuedAbstractParamConverter
{
   protected StringParameterInjector stringParameterInjector;
   @SuppressWarnings("rawtypes")
   protected ParamConverter paramConverter;
   @SuppressWarnings("rawtypes")
   protected HeaderDelegate headerDelegate;
   protected String separator;

   public MultiValuedAbstractParamConverter(final StringParameterInjector stringParameterInjector, final String separator)
   {
      this.stringParameterInjector = stringParameterInjector;
      this.paramConverter = stringParameterInjector.getParamConverter();
      this.headerDelegate = stringParameterInjector.getHeaderDelegate();
      this.separator = separator;
   }

   ////////////////////////////////////////////////////////////////////////////////////////////////////////////

   @SuppressWarnings({ "unchecked" })
   protected String stringify(Collection<?> value)
   {
      char separatorChar = getSeparatorChar();
      StringBuilder sb = new StringBuilder();
      boolean first = true;
      for (Object v : value)
      {
         if (first)
         {
            first = false;
         }
         else
         {
            sb.append(separatorChar);
         }
         if (v instanceof String)
         {
            sb.append(v);
         }
         else if (paramConverter != null)
         {
            sb.append(paramConverter.toString(v));
         }
         else if (headerDelegate != null)
         {
            sb.append(headerDelegate.toString(v));
         }
         else
         {
            sb.append(v.toString());
         }
      }
      return sb.toString();
   }

   protected char getSeparatorChar()
   {
      if (separator.charAt(0) == '[')
      {
         return separator.charAt(1);
      }
      else
      {
         return separator.charAt(0);
      }
   }
}
